#ifndef BEZIER_H
#define BEZIER_H

#include "graphicElement.h"

/*!
 *  =================================================================
 *      \class Bezier
 *      \brief
 *  =================================================================
 */

class Bezier : public GraphicElement
{
    public:

    /********************************************************************/
    /*                      Propriétés                                  */
    /********************************************************************/

    std::vector<Vectorf *> controlVertices;     //  Points de controles de la courbe de Bézier
    int discretisation;                         //  Niveau de discretisation de la courbe

    int trianglePascal [100][100];          //  Triangle de Pascal utilisé pour calculer des trucs

    //  Propriétés utilisé pour l'algorithme de DeCasteljeau

    int deCasteljeau;           //  Permet de définir si on doit afficher ou non la construction de DeCAsteljeau
    float tDeCasteljeau;        //  Permet de connaitre la valeur de t pour laquelle on affiche la construction de DeCasteljeau
    Vectorf * vDeCasteljeau;    //  Sommet de DeCasteljeau pour la valeur de t

    /********************************************************************/
    /*                      Constructeur                                */
    /********************************************************************/

    Bezier(int aDiscretisation);

    /********************************************************************/
    /*                      Méthodes                                    */
    /********************************************************************/

    /*!
     *  =================================================================================================================
     *  \fn     InitBuffers()
     *  \brief  Initialise les buffers contenant les informations concernant les sommets discretisant la courbe de bézier
     *          à savoir les coordonnées en x,y et z, la couleur de chacun de sommets
     *  =================================================================================================================
     */

    void InitBuffers();

    /*!
     *  =================================================================================================================
     *  \fn     FillBuffers()
     *  \brief  Discretise la courbe de Bezier en fonction des points de controles qui ont été définis
     *  =================================================================================================================
     */

    void FillBuffers();

    void AddControlVertex(Vectorf *);    //  Rajoute un point de controle à la courbe de Bézier

    void DeCasteljau(float t, std::vector<Vectorf*> sommets);   //  Calcul la construction de DeCasteljau pour un t donné

    int Factoriel(int);                 //  Calcul la factorielle de l'entier passé en paramètre

    float CalculPolynomeBernstein(int an, int ai, float at);

    Vectorf * CalculPointBezier(float at);   //  Calcul les coordonnées de la courbe pour un t donné

    virtual void Display();
    void RenderBuffers();
    virtual void Picking();
    virtual void SetPicking(unsigned char x, unsigned char y , unsigned char z);

};


#endif // BEZIER_H
